package org.atlantis.grosbeak.pot;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

import org.atlantis.grosbeak.lang.Exceptions;
import org.atlantis.grosbeak.pot.transaction.TransactionProvider;

/**
 * 更新操作回调的基类。
 * 
 * @author <a href="mailto:seenoevil.cn@gmail.com">SeeNoEvil</a>
 * 
 * @param <T>
 */
abstract class BaseUpdateCallback<T> {

	/**
	 * 执行更新操作。
	 * 
	 * @param txProvider
	 *            事务供应器。
	 * @param sql
	 *            需要执行的更新SQL。
	 * @param params
	 *            更新过程中所需要的参数。
	 * @return 更新后的结果。
	 */
	public final T execute(TransactionProvider txProvider, String sql,
			Object... params) {
		Connection con = txProvider.getCurrentConnection();
		PreparedStatement pstmt = null;
		try {
			pstmt = con.prepareStatement(sql);
			PotKit.bindParams(pstmt, params);
			return ctrlResult(pstmt);
		} catch (SQLException e) {
			throw Exceptions.wrapThrow(PotException.class, e);
		} finally {
			PotKit.safelyClose(pstmt);
		}
	}

	/**
	 * 对更新操作得到的结果进行操作。
	 * 
	 * @param pstmt
	 *            PreparedStatement对象。
	 * @return 操作后的结果。
	 * @throws SQLException
	 */
	protected abstract T ctrlResult(PreparedStatement pstmt)
			throws SQLException;
}
